package top.jacktgq.itheima.netty.future.compare;

import io.netty.channel.EventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.DefaultPromise;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;

/**
 * @Author CandyWall
 * @Date 2021/3/23--1:11
 * @Description
 */
@Slf4j
public class TestNettyPromise {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1. 准备EventLoop对象
        NioEventLoopGroup group = new NioEventLoopGroup();
        EventLoop eventLoop = group.next();

        // 2. 可以主动创建Promise对象，它就是一个结果容器
        DefaultPromise<Integer> promise = new DefaultPromise<>(eventLoop);
        new Thread(() -> {
            log.debug("开始计算...");
            try {
                int i = 1 / 0;
                Thread.sleep(3000);
                // 3. 任意一个线程计算完毕后向Promise填充结果
                // 填充成功结果
                promise.setSuccess(5201314);
            } catch (Exception e) {
//                e.printStackTrace();
                // 填充失败结果
                promise.setFailure(e);
            }

        }).start();

        // 4. 接收结果的线程
        // 4.1 同步方式
        log.debug("等待结果...");
        log.debug("结果是：{}", promise.get());
        // 4.2 异步方式
//        promise.addListener(future -> log.debug("结果是：{}", future.get()));
    }
}
